package com.exprecards.common.web;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.exprecards.common.persistence.exceptions.DaoException;

public abstract class GenericCrudBean<ELEMENT> implements Serializable {

	private static final long serialVersionUID = 1L;

	protected ELEMENT valorActual;

	protected abstract boolean create() throws Exception;

	protected abstract boolean update() throws Exception;
	
	protected abstract void clean();

	protected abstract void editable(int id) throws Exception;

	protected abstract void delete(int id) throws Exception;

	protected abstract boolean isId();

	public List<Map<String, String>> lista;
	
	public ELEMENT [] listaSimple;
	
	protected abstract List<Map<String, String>> consultar();
	
	protected abstract ELEMENT [] consultarSimple() throws DaoException;

	protected abstract ELEMENT createNew();
	
	public int id;

	public GenericCrudBean() {
		valorActual = createNew();
	}

	public boolean doSave() {

		boolean result=false;
		try {
			if (!isId()) {
				result = doCreate();
				// TODO Escribir en el area inferior de mensajes el resultado
				// satisfactorio.
			} else {
				result = doUpdate();
				// TODO Escribir en el area inferior de mensajes el resultado
				// satisfactorio.
			}
			lista = consultar();
			listaSimple = consultarSimple();
		} catch (Exception e) {
			// Lanzar el popup de mensajes con el detalle del error
			// (FacesMessage).
			e.printStackTrace();
		}
		
		doClean();
		
		return result;

	}

	private boolean doCreate() throws Exception {
		boolean result;
		result = create();
		doClean();
		return result;
	}

	private boolean doUpdate() throws Exception {
		boolean result;
		result = update();
		doClean();
		return result;
	}

	public void doEditable() {

		try {
			editable(id);
			// TODO Escribir en el area inferior de mensajes el resultado
			// satisfactorio.
		} catch (Exception e) {
			// Lanzar el popup de mensajes con el detalle del error
			// (FacesMessage).
			e.printStackTrace();
		}

	}

	public void doDeleted() {

		try {
			delete(id);
			doClean();
			
			lista = consultar();
			listaSimple = consultarSimple();
			// TODO Escribir en el area inferior de mensajes el resultado
			// satisfactorio.
		} catch (Exception e) {
			// Lanzar el popup de mensajes con el detalle del error
			// (FacesMessage).
			e.printStackTrace();
		}
	}

	public void doClean() {
		valorActual = createNew();
		clean();
	}

	/**
	 * @return the valorActual
	 */
	public ELEMENT getValorActual() {
		return valorActual;
	}

	/**
	 * @param valorActual the valorActual to set
	 */
	public void setValorActual(ELEMENT valorActual) {
		this.valorActual = valorActual;
	}

	/**
	 * @return the lista
	 */
	public List<Map<String, String>> getLista() {
		return lista;
	}

	/**
	 * @param lista the lista to set
	 */
	public void setLista(List<Map<String, String>> lista) {
		this.lista = lista;
	}

	public ELEMENT[] getListaSimple() {
		return listaSimple;
	}

	public void setListaSimple(ELEMENT[] listaSimple) {
		this.listaSimple = listaSimple;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
}
